`timescale 1ns / 1ns

module tb_fc_top;

    reg         clk;
    reg         rst_n_fc;

    reg [7:0]   count;
    reg         start;

    wire        done_o;

    // 第一层监视信号
    wire [31:0] fc1_output_data_monitor;
    wire        fc1_output_wren_monitor;

    // 第二层监视信号
    wire [47:0] fc2_output_data_monitor;
    wire        fc2_output_wren_monitor;

    // 第三层监视信号
    wire [63:0] fc3_output_data_monitor;
    wire        fc3_output_wren_monitor;

    fc_top u_fc_top(
        .clk(clk),
        .rst_n_fc(rst_n_fc),
        .count(count),
        .start(start),
        .done_o(done_o),
        .fc1_output_data_monitor(fc1_output_data_monitor),
        .fc1_output_wren_monitor(fc1_output_wren_monitor),
        .fc2_output_data_monitor(fc2_output_data_monitor),
        .fc2_output_wren_monitor(fc2_output_wren_monitor),
        .fc3_output_data_monitor(fc3_output_data_monitor),
        .fc3_output_wren_monitor(fc3_output_wren_monitor)
    );

    integer fc1_file;
    integer fc2_file;
    integer fc3_file;

    initial begin
        fc1_file = $fopen("D:\\Verilog\\project_FullConnectionLayer\\fc1_out.txt", "w");
        fc2_file = $fopen("D:\\Verilog\\project_FullConnectionLayer\\fc2_out.txt", "w");
        fc3_file = $fopen("D:\\Verilog\\project_FullConnectionLayer\\fc3_out.txt", "w");
        if(fc1_file == 0 || fc2_file == 0 || fc3_file == 0) begin
            $display("[TB][ERROR] Failed to open output files.");
            $finish;
        end
    end

    always @(negedge clk) begin    // 在 clk 下降沿采集写使能
        if (fc1_output_wren_monitor) begin
            // $fwrite(fc1_file, "%0d\n", $signed({24'b0, fc1_output_data_monitor[17:10]}));
            $fwrite(fc1_file, "%0d\n", $signed({28'b0, fc1_output_data_monitor[17:14]}));
        end
        if (fc2_output_wren_monitor) begin
            // $fwrite(fc2_file, "%0d\n", $signed({40'b0, fc2_output_data_monitor[16:9]}));
            $fwrite(fc2_file, "%0d\n", $signed({44'b0, fc2_output_data_monitor[11:8]}));
        end
        if (fc3_output_wren_monitor) begin
            // $fwrite(fc3_file, "%0d\n", $signed({{9{fc3_output_data_monitor[63]}}, fc3_output_data_monitor[62:8]}));
            $fwrite(fc3_file, "%0d\n", $signed({{9{fc3_output_data_monitor[63]}}, fc3_output_data_monitor[63:9]}));
        end
    end

    initial begin
        forever #5 clk = ~clk;
    end

    initial begin
        count = 0;
        repeat(42) begin // 循环42次
            // 1. 初始化信号 (相当于复位)
            clk = 0;      // 虽然 clk 由 forever 块驱动，
            rst_n_fc = 0; // 拉低复位
            start = 0;    // 确保 start 也是初始状态

            // 2. 保持复位一段时间 (模拟复位脉冲宽度)
            #20; // 等待 20 时间单位

            // 3. 释放复位
            rst_n_fc = 1; // 拉高复位，结束复位状态

            // 4. 等待一段时间后启动运算
            #10; // 等待 10 时间单位 (可选，给 DUT 一点时间稳定)

            // 5. 触发开始信号
            start = 1;    // 拉高 start 信号，开始运算

            // 6. 等待本次运算完成
            wait(done_o); // 等待 DUT 完成运算，done_o 变高
            count = count + 1;
            #10;
        end

        // 所有42轮完成后执行的操作
        $fclose(fc1_file);
        $fclose(fc2_file);
        $fclose(fc3_file);
        #10 $finish; // 结束仿真
    end

    // initial begin
    //     clk = 0;
    //     rst_n_fc = 0;
    //     start = 0;
    //     #20 rst_n_fc = 1;
    //     #10 start = 1;
    // end



    // always @(posedge clk) begin
    //     if(count == 42) begin
    //         $display("[TB][INFO] fc_top done asserted @%0t", $time);
	// 		$fclose(fc1_file);
	// 		$fclose(fc2_file);
	// 		$fclose(fc3_file);
    //         #10 $finish;
    //     end
    // end

endmodule
